package model

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"io"
)

var key = "gogokey123456789"

// 加密数据
func Encrypt(plaintext string) (string, error) {
	// 创建一个 AES 加密块

	block, err := aes.NewCipher([]byte(createHash(key)))
	if err != nil {
		return "", err
	}

	// 将明文转换为字节数组
	plaintextBytes := []byte(plaintext)

	// 创建一个字节数组来存储密文
	ciphertext := make([]byte, aes.BlockSize+len(plaintextBytes))

	// 生成一个随机的初始向量（IV）
	iv := ciphertext[:aes.BlockSize]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}

	// 创建一个流加密器
	stream := cipher.NewCFBEncrypter(block, iv)

	// 加密明文
	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintextBytes)

	// 将密文转换为 Base64 字符串
	return base64.URLEncoding.EncodeToString(ciphertext), nil
}

// 解密数据
func Decrypt(ciphertext string) (string, error) {
	// 将密文从 Base64 字符串转换为字节数组
	ciphertextBytes, err := base64.URLEncoding.DecodeString(ciphertext)
	if err != nil {
		return "", err
	}

	// 创建一个 AES 加密块
	block, err := aes.NewCipher([]byte(createHash(key)))
	if err != nil {
		return "", err
	}

	// 检查密文的长度
	if len(ciphertextBytes) < aes.BlockSize {
		return "", fmt.Errorf("ciphertext too short")
	}

	// 分离初始向量（IV）和密文
	iv := ciphertextBytes[:aes.BlockSize]
	ciphertextBytes = ciphertextBytes[aes.BlockSize:]

	// 创建一个流解密器
	stream := cipher.NewCFBDecrypter(block, iv)

	// 解密密文
	stream.XORKeyStream(ciphertextBytes, ciphertextBytes)

	// 将解密后的字节数组转换为字符串
	return string(ciphertextBytes), nil
}

// 创建一个哈希值作为密钥
func createHash(key string) []byte {
	hasher := sha256.New()
	hasher.Write([]byte(key))
	return hasher.Sum(nil)
}
